var goyello = goyello || {};

goyello.logic = function(viewController, resource)
{
    var aIds = ['ADDRESSID', 'LABEL', 'STREET', 'HOUSENUMBER', 'POSTALCODE', 'COUNTRY', 'CITY']
    ,   oInputs = {}
    ,   sAddress = resource
    ,   oView = viewController
    ,   oSelf;

    (function fInit()
    {
        var n = aIds.length;

        while(n--)
        {
            oInputs[aIds[n]] = $('#' + aIds[n]);
        }
        oView.clearForm();
    })();

    function fGetData()
    {
        var n = aIds.length
        ,   data = {}
        ,   id;

        while(n--)
        {
            id = aIds[n];
            data[id] = oInputs[id].val();
        }
        return data;
    }

    function fGetId()
    {
        return oInputs['ADDRESSID'].val();
    }

    function fGetUrl(id)
    {
        var url = sAddress;

        if (typeof id !== 'undefined' && parseInt(id) > 0)
        {
            url += '/' + id;
        }
        return url;
    }

    function fRest(method, handler, id)
    {
        var args = {
            url : fGetUrl(id),
            type: method,
            success: handler,
            dataType : 'json'
        };

        if (method.toUpperCase() == 'PUT')
        {
            args.data = JSON.stringify(fGetData());
        }
        else if (method.toUpperCase() == 'POST')
        {
            args.data = fGetData();
        }

        $.ajax(args);
    }

    function fAdd()
    {
        fRest('POST', function(data)
        {
            if (true === data.status)
            {
                fGetAll();
                oView.clearForm();
            }
            else
            {
                oView.error(data.result || 'Wystąpił błąd, spróbuj ponownie');
            }
        });
    }

    function fGet(id)
    {
        fRest('GET', function(data)
        {
            oView.fillFulForm(data[0] || null);
        }, id);
    }

    function fGetAll()
    {
        fRest('GET', function(data)
        {
            oView.createList(data, oSelf);
        });
    }

    function fDelete()
    {
        var id = fGetId();
        if (id && confirm('Czy na pewno chcesz usunąć wpiso  id ' + id))
        {
            fRest('DELETE', function(data)
            {
                if (true === data.status)
                {
                    fGetAll();
                    oView.clearForm();
                }
                else
                {
                    oView.error(data.result || 'Wystąpił błąd podczas usuwania elementu o id ' + id);
                }
            }, id);
        }
    }

    function fDeleteAll()
    {
        if (confirm('Czy na pewno chcesz usunąć wszystkie wpisy'))
        {
            fRest('DELETE', function(data)
            {
                if (true === data.status)
                {
                    oView.clearList();
                    oView.clearForm();
                }
                else
                {
                    oView.error(data.result || 'Wystąpił błąd podczas usuwania wszystkich elementów');
                }
            });
        }
    }

    function fUpdate()
    {
        var id = fGetId();
        fRest('PUT', function(data)
        {
            if (true === data.status)
            {
                fGetAll();
            }
            else
            {
                oView.error(data.result || 'Wystąpił błąd podczas zapisywania zmian w adresie o id ' + id);
            }
        }, id);
    }

    return oSelf = {
        add : fAdd,
        get : fGet,
        getAll : fGetAll,
        del : fDelete,
        deleteAll : fDeleteAll,
        update : fUpdate
    };
};
